package com.atwulidun.interpreter19;

import java.util.Map;

public abstract class Expression {
    // 解释方法：最后返回一个int类型的计算结果
    public abstract int interpret(Map<String, Integer> var);
}

// TerminalExpression类：对应每一个变量
class VarExpression extends Expression {
    // 维护一个变量
    private String key;

    public VarExpression(String key) {
        this.key = key;
    }

    @Override
    public int interpret(Map<String, Integer> var) {
        // 从var中取出key对应的value值返回即可
        return var.get(key);
    }
}

// NonTerminalExpression类：对应每一个运算符
class OperatorExpression extends Expression {
    // 维护一个左表达式和一个右表达式
    protected Expression left;
    protected Expression right;

    public OperatorExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    // 因为OperationExpression还有更具体的子类，因此interpret方法空实现即可
    @Override
    public int interpret(Map<String, Integer> var) {
        return 0;
    }
}

// 以下两个为NonTerminalExpression的具体子类
// 运算符"+"对应的类
class AddExpression extends OperatorExpression {
    public AddExpression(Expression left, Expression right) {
        super(left, right);
    }
    // 要对左表达式和右表达式进行操作
    @Override
    public int interpret(Map<String, Integer> var) {
        return left.interpret(var) + right.interpret(var);
    }
}
// 运算符"-"对应的类
class SubExpression extends OperatorExpression {
    public SubExpression(Expression left, Expression right) {
        super(left, right);
    }
    // 要对左表达式和右表达式进行操作
    @Override
    public int interpret(Map<String, Integer> var) {
        return left.interpret(var) - right.interpret(var);
    }
}